%% 第八章：MIMO信道容量 - 模块化主仿真脚本
% MIMO系统容量分析与预编码技术
% 作者：周勇
% 日期：2024年

clc;
clear all;
close all;

%% 添加路径
addpath('../Common');

%% 获取颜色定义
colors = color_definitions();

%% 基本参数设置
SNR_dB = -5:5:30; % 信噪比范围 (dB)
antenna_configs = [1, 2, 4, 8, 16]; % 天线配置
num_realizations = 500; % 蒙特卡洛仿真次数

fprintf('=== MIMO信道容量分析 ===\n');

%% 8.1 确定性MIMO信道容量分析
fprintf('\n--- 8.1 确定性MIMO信道容量分析 ---\n');

% 分析确定性信道容量
results_det = deterministic_mimo_capacity('SNR_dB', SNR_dB);

% 绘制确定性信道容量
figure('Name', '确定性MIMO信道容量', 'Position', [100, 100, 1200, 800]);

subplot(2,2,1);
plot(SNR_dB, det_capacity_csi, 'b-', 'LineWidth', 2);
hold on;
plot(SNR_dB, det_capacity_no_csi, 'r--', 'LineWidth', 2);
grid on;
xlabel('SNR (dB)');
ylabel('容量 (bps/Hz)');
title('确定性4x4 MIMO信道容量');
legend('已知CSI', '未知CSI');

% 奇异值分析
[U, S, V] = svd(H_det);
singular_values = diag(S);

subplot(2,2,2);
plot(singular_values, 'o-', 'LineWidth', 2);
grid on;
xlabel('模式索引');
ylabel('奇异值');
title('信道奇异值分布');

% 功率分配 (特定SNR)
snr_fixed = 15; % dB
snr_linear = 10^(snr_fixed/10);
[opt_powers, water_level] = water_filling_powers(singular_values, snr_linear);

subplot(2,2,3);
bat(opt_powers);
grid on;
title(sprintf('注水功率分配 (SNR=%d dB)', snr_fixed));
xlabel('模式索引');
ylabel('分配功率');

% 容量贡献分析
mode_contributions = zeros(length(singular_values), 1);
for i = 1:length(singular_values)
    if opt_powers(i) > 0
        mode_contributions(i) = log2(1 + snr_linear * opt_powers(i) * singular_values(i)^2);
    end
end

subplot(2,2,4);
pie(mode_contributions);
title('各模式容量贡献');
legend(arrayfun(@(x) sprintf('模式%d', x), 1:length(singular_values), 'UniformOutput', false));

%% 8.3 MIMO容量与天线数量缩放分析
fprintf('\n--- 8.3 MIMO容量与天线数量缩放分析 ---\n');

% 分析容量与天线数量的关系
results_scaling = mimo_capacity_scaling('antenna_configs', antenna_configs, ...
                                       'num_realizations', num_realizations);

%% 8.4 相关信道中的MIMO容量分析
fprintf('\n--- 8.4 相关信道中的MIMO容量分析 ---\n');

% 分析空间相关性对容量的影响
results_corr = correlated_mimo_capacity('SNR_dB', SNR_dB, ...
                                     'num_realizations', num_realizations);

%% 8.4 相关信道中的MIMO容量
fprintf('\n--- 8.4 相关信道中的MIMO容量 ---\n');

% 空间相关性影响
Nt = 4; Nr = 4;
correlation_values = [0, 0.3, 0.6, 0.9];
corr_capacity = zeros(length(SNR_dB), length(correlation_values));

for corr_idx = 1:length(correlation_values)
    rho = correlation_values(corr_idx);
    fprintf('空间相关性: %.1f\n', rho);
    
    for snr_idx = 1:length(SNR_dB)
        snr = SNR_linear(snr_idx);
        
        % 生成相关信道
        capacities_corr = zeros(num_realizations, 1);
        
        for real = 1:num_realizations
            H_corr = generate_correlated_channel(Nt, Nr, rho);
            capacities_corr(real) = log2(det(eye(Nr) + (snr/Nt) * H_corr * H_corr'));
        end
        
        corr_capacity(snr_idx, corr_idx) = mean(capacities_corr);
    end
end

% 绘制相关信道容量
figure('Name', '相关信道中的MIMO容量', 'Position', [250, 250, 1200, 800]);

subplot(2,2,1);
for corr_idx = 1:length(correlation_values)
    plot(SNR_dB, corr_capacity(:, corr_idx), ...
         ['-', colors(corr_idx)], 'LineWidth', 2);
    hold on;
end
grid on;
xlabel('SNR (dB)');
ylabel('容量 (bps/Hz)');
title('相关信道中的MIMO容量');
legend(arrayfun(@(x) sprintf('ρ=%.1f', x), correlation_values, 'UniformOutput', false));

% 容量损失分析
subplot(2,2,2);
capacity_loss = (corr_capacity(:, 1) - corr_capacity) ./ corr_capacity(:, 1) * 100;
for corr_idx = 2:length(correlation_values)
    plot(SNR_dB, capacity_loss(:, corr_idx), ...
         ['-', colors(corr_idx)], 'LineWidth', 2);
    hold on;
end
grid on;
xlabel('SNR (dB)');
ylabel('容量损失 (%)');
title('相关性导致的容量损失');
legend(arrayfun(@(x) sprintf('ρ=%.1f', x), correlation_values(2:end), 'UniformOutput', false));

% 特征值分布分析 (固定SNR)
snr_fixed = 15; % dB
snr_idx = find(SNR_dB == snr_fixed, 1);

eigenvalue_distributions = cell(length(correlation_values), 1);
for corr_idx = 1:length(correlation_values)
    rho = correlation_values(corr_idx);
    
    % 生成多个信道样本
    num_samples = 1000;
    all_eigenvalues = [];
    
    for i = 1:num_samples
        H_sample = generate_correlated_channel(Nt, Nr, rho);
        eigenvals = eig(H_sample * H_sample');
        all_eigenvalues = [all_eigenvalues; eigenvals];
    end
    
    eigenvalue_distributions{corr_idx} = all_eigenvalues;
end

subplot(2,2,3);
for corr_idx = 1:length(correlation_values)
    histogram(eigenvalue_distributions{corr_idx}, 30, 'Normalization', 'pdf');
    hold on;
end
grid on;
xlabel('特征值');
ylabel('概率密度');
title(sprintf('特征值分布 (SNR=%d dB)', snr_fixed));
legend(arrayfun(@(x) sprintf('ρ=%.1f', x), correlation_values, 'UniformOutput', false));

% 条件数统计
subplot(2,2,4);
condition_numbers = zeros(length(correlation_values), 1);
for corr_idx = 1:length(correlation_values)
    rho = correlation_values(corr_idx);
    
    cond_nums = zeros(num_realizations, 1);
    for real = 1:num_realizations
        H_cond = generate_correlated_channel(Nt, Nr, rho);
        cond_nums(real) = cond(H_cond);
    end
    
    condition_numbers(corr_idx) = mean(cond_nums);
end

bat(condition_numbers);
grid on;
title('信道条件数 vs 相关性');
xlabel('相关性');
ylabel('平均条件数');
set(gca, 'XTickLabel', arrayfun(@(x) sprintf('%.1f', x), correlation_values, 'UniformOutput', false));

%% 8.5 MIMO预编码技术分析
fprintf('\n--- 8.5 MIMO预编码技术分析 ---\n');

% 分析不同预编码方案的性能
results_precoding = mimo_precoding_analysis('SNR_dB', SNR_dB, ...
                                           'num_realizations', num_realizations);

%% 结果保存与总结
fprintf('\n=== 结果保存 ===\n');

% 创建结果文件夹（在当前章节目录下）
if ~exist('results', 'dir')
    mkdir('results');
end

% 保存所有结果
save('results/mimo_capacity_results.mat', 'results_det', 'results_fading', ...
     'results_scaling', 'results_corr', 'results_precoding');

fprintf('结果已保存到 Chapter08_MIMO_Capacity/results/mimo_capacity_results.mat\n');

%% 总结
fprintf('\n=== 本章总结 ===\n');
fprintf('1. 发送端CSI可显著提升MIMO容量\n');
fprintf('2. 衰落信道容量存在随机性，需考虑中断容量\n');
fprintf('3. 容量随天线数量线性增加\n');
fprintf('4. 空间相关性会降低MIMO容量\n');
fprintf('5. 预编码技术可有效对抗信道衰落\n');
fprintf('\n所有结果已保存到 Chapter08_MIMO_Capacity/results/ 文件夹\n');

fprintf('\n仿真完成！请查看生成的图形窗口。\n');